package vip.xiaonuo.sys.fymodule.account.util;


import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.Map;
import java.util.Set;

public class UniversalCamelCaseConverter {

    /**
     * 通用命名转小驼峰命名
     * 支持转换：user_name -> userName, TranItemArray -> tranItemArray
     *
     * @param input 原始字段名
     * @return 驼峰格式字段名
     */
    public static String toCamelCase(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }

        // 处理连续大写字母的情况（如"TranItemArray"）
        String normalized = input
                .replaceAll("([A-Z]+)([A-Z][a-z])", "$1_$2")  // 处理全大写前缀
                .replaceAll("([a-z])([A-Z])", "$1_$2")        // 处理驼峰边界
                .replaceAll("[-\\s]", "_")                    // 统一分隔符
                .toLowerCase();

        // 分割单词并转换为驼峰
        StringBuilder camelCase = new StringBuilder();
        boolean capitalizeNext = false;

        for (char c : normalized.toCharArray()) {
            if (c == '_') {
                capitalizeNext = true;
            } else {
                if (capitalizeNext) {
                    camelCase.append(Character.toUpperCase(c));
                    capitalizeNext = false;
                } else {
                    camelCase.append(c);
                }
            }
        }

        // 确保首字母小写
        if (!camelCase.isEmpty()) {
            camelCase.setCharAt(0, Character.toLowerCase(camelCase.charAt(0)));
        }

        return camelCase.toString();
    }

    /**
     * 递归转换JSONObject中的key为驼峰命名
     *
     * @param jsonObject 需要转换的JSON对象
     * @return 转换后的新JSONObject
     */
    public static JSONObject convertKeys(JSONObject jsonObject) {
        if (jsonObject == null) return null;

        JSONObject result = new JSONObject(true); // 保持顺序

        Set<Map.Entry<String, Object>> entries = jsonObject.entrySet();
        for (Map.Entry<String, Object> entry : entries) {
            String key = entry.getKey();
            Object value = entry.getValue();
            String newKey = toCamelCase(key);

            if (value instanceof JSONObject) {
                result.put(newKey, convertKeys((JSONObject) value));
            } else if (value instanceof JSONArray) {
                result.put(newKey, convertArray((JSONArray) value));
            } else {
                result.put(newKey, value);
            }
        }
        return result;
    }

    /**
     * 处理JSON数组
     *
     * @param array JSON数组
     * @return 转换后的数组
     */
    private static JSONArray convertArray(JSONArray array) {
        if (array == null || array.isEmpty()) return array;

        JSONArray result = new JSONArray();
        for (int i = 0; i < array.size(); i++) {
            Object element = array.get(i);
            if (element instanceof JSONObject) {
                result.add(convertKeys((JSONObject) element));
            } else if (element instanceof JSONArray) {
                result.add(convertArray((JSONArray) element));
            } else {
                result.add(element);
            }
        }
        return result;
    }


}
